Capítulo 2 - Proceso de software
Un proceso de software es un conjunto de actividades relacionadas que lleva a la producción de un sistema de software. Las cuatro etapas son complejas e incluyen subactividades, y el propio proceso puede tener otras actividades.
En ocasiones, los procesos de software se clasifican como dirigidos por un plan (plan-driven) o como procesos ágiles.
Los procesos dirigidos por un plan son aquellos donde todas las actividades del proceso se planean por anticipado y el avance se mide contra dicho plan.
En los procesos ágiles, la planeación es incremental y es más fácil modificar el proceso para reflejar los requerimientos cambiantes del cliente.
Por lo general, uno necesita encontrar un equilibrio entre procesos dirigidos por un plan y procesos ágiles.
Aunque no hay un proceso de software “ideal”, en muchas organizaciones sí existe un ámbito para mejorar el proceso de software.
Cuando se describe un proceso, generalmente hablamos de las actividades de dicho proceso (“especificar el modelo de datos”, “diseñar la interfaz de usuario”) y el orden en el cual se deberían realizar.
Las descripciones de los procesos también deben incluir:
Dichos modelos no son mutuamente excluyentes y con frecuencia se usan en conjunto, sobre todo para el desarrollo de grandes sistemas. Para este tipo de sistemas, tiene sentido combinar algunas de las mejores características de los modelos de desarrollo en cascada e incremental. Se necesita contar con información sobre los requerimientos esenciales del sistema para diseñar la arquitectura de software que apoye dichos requerimientos. No puede desarrollarse de manera incremental.
Los subsistemas dentro de un sistema más grande se desarrollan usando diferentes enfoques. Partes del sistema que son bien comprendidas pueden especificarse y desarrollarse al utilizar un proceso basado en cascada. Partes del sistema que por adelantado son difíciles de especificar, como la interfaz de usuario, siempre deben desarrollarse con un enfoque incremental.
Existen muchos diferentes procesos de software, pero todos deben incluir cuatro actividades que son fundamentales para la ingeniería de software.
Tienen que definirse tanto la funcionalidad del software como las restricciones de su operación. Por lo general, los requerimientos se presentan en dos niveles de detalle. Los usuarios finales y clientes necesitan un informe de requerimientos de alto nivel; los desarrolladores de sistemas precisan una descripción más detallada del sistema.
Existen cuatro actividades principales en el proceso de ingeniería de requerimientos:
Debe desarrollarse el software para cumplir con las especificaciones. La etapa de implementación de desarrollo del software corresponde al proceso de convertir una especificación del sistema en un sistema ejecutable. Siempre incluye procesos de diseño y programación de software, aunque también puede involucrar la corrección en la especificación del software.
Un diseño de software (el producto) se entiende como una descripción de la estructura del software que se va a implementar, los modelos y las estructuras de datos utilizados por el sistema, las interfaces entre componentes del sistema y, en ocasiones, los algoritmos usados.
Las actividades en el proceso de diseño varían dependiendo del tipo de sistema a desarrollar:
Por lo general, los programadores realizan algunas pruebas del código que desarrollaron. Esto revela con frecuencia defectos del programa que deben eliminarse del programa. A esta actividad se le llama depuración (debugging). La prueba de defectos y la depuración son procesos diferentes. La primera establece la existencia de defectos, en tanto que la segunda se dedica a localizar y corregir dichos defectos.
Se crea para mostrar que un sistema cumple tanto con sus especificaciones como con las expectativas del cliente. Las pruebas del programa, donde el sistema se ejecuta a través de datos de prueba simulados, son la principal técnica de validación. Esta última también puede incluir procesos de comprobación, como inspecciones y revisiones en cada etapa del proceso de software.
En desarrollo incremental, cada incremento se prueba según sus requerimientos. En desarrollo dirigido por pruebas, las mismas se desarrollan junto con los requerimientos antes de empezar. En desarrollo por plan, se hacen planes de prueba (el modelo en V). El beta testing consiste en enviar el software a posibles clientes para que reporten problemas.
El software tiene que evolucionar para satisfacer las necesidades cambiantes del cliente. La distinción entre desarrollo y mantenimiento es cada vez más irrelevante. Es muy difícil que cualquier sistema de software sea un sistema completamente nuevo, y tiene mucho más sentido ver el desarrollo y el mantenimiento como un continuo. En lugar de dos procesos separados, es más realista pensar en la ingeniería de software como un proceso evolutivo, donde el software cambia continuamente a lo largo de su vida, en función de los requerimientos y las necesidades cambiantes del cliente.
Cualquiera que sea el modelo del proceso de software utilizado, es esencial que ajuste los cambios al software a desarrollar. El cambio se agrega a los costos del desarrollo de software debido a que, por lo general, significa que el trabajo ya terminado debe volver a realizarse. A esto se le llama rehacer.
Existen dos enfoques relacionados que se usan para reducir los costos del rehacer:
Un prototipo se debe desarrollar de forma rápida e iterativa para que los costos sean controlados y se pueda experimentar con él de forma temprana. Los prototipos les permiten a los potenciales usuarios ver si el sistema les sirve, e incluso puede revelar nuevos requerimientos o errores.
Los prototipos permiten verificar si un requerimiento es realizable. El objetivo de un prototipo se debe definir desde el principio: desarrollar la interfaz de usuario, un sistema para validar requerimientos, o mostrar la aplicación. Suelen no ser compatibles. Finalmente, para evaluar un prototipo, hay que entrenar al usuario, que no está acostumbrado, y puede no dar resultados correctos.
Las entregas incrementales funcionan con las características del desarrollo incremental. Cada incremento es probado por el cliente, por lo que pueden experimentar para agregar nuevos requerimientos. Como las partes más importantes son las que reciben más testing, por ser hechas primero, tendrán menos errores. Es difícil de implementar cuando se está reemplazando un sistema existente, pues los usuarios están acostumbrados a tener todas las funcionalidades. No es aplicable para los mismos casos que el modelo en cascada sí lo es; en estos casos, son mejores los prototipos.
El enfoque de madurez de procesos busca mejorar la calidad del producto y que el proceso sea predecible. Por otro lado, el enfoque ágil sostiene que los mejores procesos son los que tienen menores costos generales. El primero se basa en desarrollo dirigido por planes y tiene mayores costos, mientras que el segundo disminuye la formalidad y documentación, enfocándose en el código.
El análisis de procesos se puede hacer con características como velocidad y robustez. En el primer ciclo de cambios hay que recoger información del proceso para poder mejorar. Es una actividad a largo plazo y continua, dados los cambios del mercado. La madurez de los procesos refleja la administración y medidas de los mismos, así como el uso de buenas prácticas de ingeniería de software por parte de la compañía.
En el nivel inicial del modelo de madurez de procesos, los objetivos del área están satisfechos. En el nivel gestionado, además debe haber documentación de los objetivos, y monitorear los procesos. En el nivel definido, se estandarizan los procesos, y se obtienen medidas para el futuro. En el nivel gestionado cuantitativamente, se usan medidas cuantitativas para controlar subprocesos. En el nivel de optimización, se usan las medidas obtenidas para mejorar los procesos.
Las dificultades de aplicar este modelo por sus costos en modelos ágiles resultan en que sólo compañías grandes lo usan.